
#include "stdio.h"
#include "stdlib.h"
#include "../User/BSP/BUZZER/buzzer.h"
#include "systick.h"
#include "../User/BSP/REMOTE/remote.h"


RemoteRecieve_struct RemoteRecieve;

bool LevelAnalysis;


/*!
    \brief      vremoteInit
    \param[in]  none
    \param[out] none
    \retval     none
*/
void vremoteInit(void)
{

    rcu_periph_clock_enable(REMOTE_RCU_GPIOx);
    rcu_periph_clock_enable(RCU_AF);

    gpio_init(REMOTE_GPIOx, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, REMOTE_GPIO_PINx);

    nvic_irq_enable(EXTI1_IRQn, 2U, 0U);
    gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_1);
    exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
    exti_interrupt_flag_clear(EXTI_1);

}

uint8_t ChecksumCalc;
/*!
    \brief      vremoteRecieveData
    \param[in]  none
    \param[out] none
    \retval     none
*/
void vremoteRecieveData(void)
{
    if(RemoteRecieve.ReceivingCompleted)
    {
        RemoteRecieve.ReceivingCompleted = false;
        if((RemoteRecieve.Remote.Info.FrameHeader == 0xFB) && (RemoteRecieve.Remote.Info.FrameTail == 0xFE))
        {
            vbuzzerSetRing(1, 100);
            ChecksumCalc = 0;
            for(uint8_t i = 1; i < 8; i++)
            {
                ChecksumCalc += RemoteRecieve.Remote.Byte[i];
            }
            if(ChecksumCalc == RemoteRecieve.Remote.Info.Checksum)
            {
                if(RemoteRecieve.Remote.Info.Cmd == 0x01)
                {

                }
                else if(RemoteRecieve.Remote.Info.Cmd == 0x02)
                {

                }
                else
                {

                }
            }

        }



    }
}
/*!
    \brief      EXTI1_IRQHandler
    \param[in]  none
    \param[out] none
    \retval     none
*/
void EXTI1_IRQHandler(void)
{
    if (exti_interrupt_flag_get(EXTI_1) == SET)
    {
        if(SET == gpio_input_bit_get(REMOTE_GPIOx, REMOTE_GPIO_PINx))
        {

            if(RemoteRecieve.GuideCode)
            {
                if((RemoteRecieve.remoteRecieveTime > 1) && \
                        (RemoteRecieve.remoteRecieveTime < 4))
                {
                    RemoteRecieve.Byte <<= 1;
                    RemoteRecieve.Byte |= 1;

                    RemoteRecieve.BitCount++;
                }
                else if((RemoteRecieve.remoteRecieveTime > 4) && \
                        (RemoteRecieve.remoteRecieveTime < 9))
                {
                    RemoteRecieve.Byte <<= 1;
                    RemoteRecieve.Byte |= 0;
                    RemoteRecieve.BitCount++;
                }

                if(RemoteRecieve.BitCount >= 8)
                {
                    RemoteRecieve.BitCount = 0;
                    RemoteRecieve.Remote.Byte[RemoteRecieve.ByteCount++] = RemoteRecieve.Byte;
                    RemoteRecieve.Byte = 0;
                    if(RemoteRecieve.ByteCount >= 10)
                    {
                        RemoteRecieve.ReceivingCompleted = true;
                        RemoteRecieve.GuideCode = false;
                    }
                    RemoteRecieve.remoteRecieveTime = 0;
                }
            }

            if((RemoteRecieve.remoteRecieveTime > 1) && \
                    (RemoteRecieve.remoteRecieveTime < 4))
            {
                RemoteRecieve.SynchronizationCode = true;
            }
            else if(RemoteRecieve.SynchronizationCode && \
                    (RemoteRecieve.remoteRecieveTime > 80) && \
                    (RemoteRecieve.remoteRecieveTime < 90))
            {


                RemoteRecieve.GuideCode = true;
                RemoteRecieve.BitCount = 0;
                RemoteRecieve.ByteCount = 0;
                RemoteRecieve.Byte = 0;
                RemoteRecieve.SynchronizationCode = false;
            }
            else
            {
                RemoteRecieve.SynchronizationCode = false;
            }


            LevelAnalysis = true;
        }
        else
        {

            RemoteRecieve.remoteRecieveTime = 0;
            LevelAnalysis = false;

        }

    }
    exti_interrupt_flag_clear(EXTI_1);
}
